#ifndef NETLIB_EPOLLPOLLER_H
#define NETLIB_EPOLLPOLLER_H

#include "Poller.h"

#include <vector>

struct epoll_event;

namespace netlib
{

namespace net
{

class EPollPoller : public Poller
{
public:
    EPollPoller(EventLoop* loop); // 创建内核事件表

    ~EPollPoller() override; // 关闭内核事件表

    // 调用::epoll
    Timestamp poll(int timeoutMs, ChannelList* activeChannels) override;

    void updateChannel(Channel* channel) override; // 更新channel通道的监听事件

    void removeChannel(Channel* channel) override; // 从事件表中删除

private:
    static const int kInitEventListSize = 16; // 就绪事件容器，预分配16个空间

    static const char* operationToString(int op); // 将事件表动作转换成字符串返回

    // 将活跃通道加入到活动通道列表
    void fillActiveChannels(int numEvents,ChannelList* activeChannels) const;

    void update(int operation, Channel* channel); // updateChannel调用，修改channel的事件

    typedef std::vector<struct epoll_event> EventList;

    int epollfd_;               // 内核事件表fd
    EventList events_;          // 存储就绪事件的容器

}; // class EPollPoller end

} // namespace net end

} // namespace netlib end
#endif